/*
 * 功能：文件控制器，处理文件上传和下载的HTTP请求
 * 作者：张杨(Sunny)
 * 日期： 2024/10/27 上午10:32
 */
package com.example.springboot.control;

import cn.hutool.core.io.FileUtil;
import com.example.springboot.common.AuthAccess;
import com.example.springboot.common.Result;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;


/**
 * 文件的控制器
 * 处理文件上传和下载的HTTP请求
 */
@RestController
@RequestMapping("/file")
public class FileController {

    @Value("${ip}")
    String ip;

    @Value("${server.port}")
    String port;

    // 定义文件存储的父目录路径，基于当前工作目录下的files文件夹
    private static final String PARENT_PATH = System.getProperty("user.dir") + File.separator + "files";

    @PostMapping("/upload")
    public Result upload(MultipartFile file) throws IOException {

        String originalFilename = file.getOriginalFilename(); // 获取原始文件名
        String mainName = FileUtil.mainName(originalFilename); // 获取文件主名（不含扩展名） xxx.
        String extName = FileUtil.extName(originalFilename); // 获取后缀名 .pdf

        // 检查父目录是否存在，不存在则创建
        if (!FileUtil.exist(PARENT_PATH)) {
            FileUtil.mkdir(PARENT_PATH);
        }

        // 如果存在同名文件，添加时间戳前缀
        if (FileUtil.exist(PARENT_PATH + File.separator + originalFilename)) {
            originalFilename = System.currentTimeMillis() + "_" + mainName + "." + extName;
        }
        // 创建目标文件对象并保存上传的文件
        File saveFile = new File(PARENT_PATH + File.separator + originalFilename);
        file.transferTo(saveFile);

        // 构建文件下载URL
        String url = "http://" + ip + ":" + port + "/file/download/" + originalFilename;
        return Result.success(url); // 返回文件下载链接
    }


    /**
     * 文件下载的处理方法
     *
     * @param fileName 文件名
     * @param response HttpServletResponse对象
     * @throws IOException 如果文件操作失败抛出IO异常
     */
    @AuthAccess // 不需要认证
    @GetMapping("/download/{fileName}")
    public void download(@PathVariable String fileName, HttpServletResponse response) throws IOException {
        // 构建完整的文件路径
        String filePath = PARENT_PATH + File.separator + fileName;

        // 检查文件是否存在，不存在则直接返回
        if (!FileUtil.exist(filePath)) {
            return;
        }

        byte[] bytes = FileUtil.readBytes(filePath); // 读取文件字节
        ServletOutputStream outputStream = response.getOutputStream(); // 获取响应输出流
        outputStream.write(bytes); // 将文件字节流写入响应输出流
        outputStream.flush(); // 刷新
        outputStream.close(); // 关闭
    }
}
